package com.atguigu.guli.service.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;
import com.atguigu.guli.service.oss.service.FileService;
import com.atguigu.guli.service.oss.util.OssProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {
    @Autowired
    OssProperties ossProperties;

    String sheme;
    String endpoint;
    // 云账号AccessKey有所有API访问权限，建议遵循阿里云安全最佳实践，创建并使用RAM子账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建。
    String accessKeyId;
    String accessKeySecret;
    String bucketName;

    //    在当前类的对象创建后初始化它的的属性
    @PostConstruct//标准的方法会在当前类的构造器调用后执行一次
    public void init() {
        sheme = ossProperties.getSheme();
        endpoint = ossProperties.getEndpoint();
    // 云账号AccessKey有所有API访问权限，建议遵循阿里云安全最佳实践，创建并使用RAM子账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建。
        accessKeyId = ossProperties.getAccessKeyId();
        accessKeySecret = ossProperties.getAccessKeySecret();
        bucketName = ossProperties.getBucketName();
    }

    @Override
    public String uploadFile(String module, MultipartFile file) throws IOException {

    // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(sheme+endpoint, accessKeyId, accessKeySecret);

    // 上传文件流。

        InputStream inputStream = file.getInputStream();
        String filePath = file.getOriginalFilename();//获取上传文件的文件名

    //        保存文件会存在 桶/路径/文件名
        String fileName= module+"/"+ UUID.randomUUID().toString().replace("-","")+filePath.substring(filePath.lastIndexOf("."));

        ossClient.putObject(bucketName, fileName, inputStream);

    //        上传成功图片地址
        String avatarUrl = sheme + bucketName + "." + endpoint + "/" + fileName;
        System.out.println("avatarUrl = " + avatarUrl);

    // 关闭OSSClient。
        ossClient.shutdown();


        return avatarUrl;
    }

    @Override
    public void deleteFile(String module, String path) {
        String objectName = module + path.substring(path.lastIndexOf("/"));
    // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(sheme+endpoint, accessKeyId, accessKeySecret);

    // 删除文件。如需删除文件夹，请将ObjectName设置为对应的文件夹名称。如果文件夹非空，则需要将文件夹下的所有object删除后才能删除该文件夹。
    //        objectName    桶内的文件路径+ 文件名
        ossClient.deleteObject(bucketName, objectName);

    // 关闭OSSClient。
        ossClient.shutdown();
    }

    @Override
    public void batchDeleteFile(String module, List<String> paths) {


    // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(sheme+endpoint, accessKeyId, accessKeySecret);

    // 删除文件。key等同于ObjectName，表示删除OSS文件时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
        List<String> keys = new ArrayList<String>();
    //        keys.add("key0");
    //        keys.add("key1");
    //        keys.add("key2");
        for (String path : paths) {
            String objectName = module + path.substring(path.lastIndexOf("/"));
            keys.add(objectName);
        }

        DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
        List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();

    // 关闭OSSClient。
        ossClient.shutdown();

    }
}
